import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

/**
 * @author deity
 * @version 1.0
 * @date 2020/11/8 13:36
 * <p>
 * 1-静态方法引用的使用
 * 类型名称.方法名称() --> 类型名称::方法名称
 * </p>
 * 2-实例方法引用的使用
 * 创建类型对应的一个对象  --> 对象应用::实例方法名称
 */
public class MethodReference {
    public static void main(String[] args) {

        //存储Person对象的列表
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("tom", "男", 12));
        personList.add(new Person("celia", "女", 22));
        personList.add(new Person("like", "男", 30));
        personList.add(new Person("vicky", "女", 30));
        personList.add(new Person("kite", "男", 23));

        // 1-匿名内部类实现方式
//        Collections.sort(personList, new Comparator<Person>() {
//            public int compare(Person o1, Person o2) {
//                return o1.getAge()-o2.getAge();
//            }
//        });


        // 2-Lambda表达式实现方式
//        Collections.sort(personList, (p1, p2) -> p1.getAge() - p2.getAge());

        // 3-静态方法的引用
//        Collections.sort(personList, Person::compareByAge);

        // 4-实例方法引用
//        PersonUtil pu = new PersonUtil();
//        Collections.sort(personList, pu::compareByName);
//
//        System.out.println(personList);


        // 5-构造方法引用: 绑定函数式接口
        IPerson ip = Person::new;
        Person person = ip.initPerson("deity", "男", 28);
        System.out.println(person);

    }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String name;//姓名
    private String gender;//性别
    private int age;//年龄

    public static int compareByAge(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

class PersonUtil {
    //增加一个实例方法
    public int compareByName(Person p1, Person p2) {
        return p1.getName().hashCode() - p2.getName().hashCode();
    }
}

interface IPerson {
    //抽象方法: 通过指定类型的构造方法初始化对象数据
    Person initPerson(String name, String gender, int age);
}
